package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.TeseBD;
import BD.AlunoBD;

public class TeseDAO {
    
    // Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodos unique, auto incremento
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDTese;
    ResultSet rs;
    
    public int autoIncremento(){
        return metBD.autoIncremento("tese", "cod_tese");
    }
    
    public List<TeseBD> filtro(String campo, String valor) {      
        List<TeseBD> listaFiltro = new ArrayList<TeseBD>(); 
        try { 
            Connection con = conBD.conectar();
            
            BDTese = con.createStatement();

            rs = BDTese.executeQuery("select t.cod_tese, t.ra_al, "
                    + " t.titulo_tese, t.qualificada_tese, t.defendida_tese, a.nome_al, "
                    + " t.cod_linhapesquisa, l.nome_linhapesquisa "
                    + " from tese t , aluno a , linhapesquisa l"
                    + " where a.ra_al = t.ra_al and "
                    + " t.cod_linhapesquisa = l.cod_linhapesquisa and "
                    + " "+campo+" like '" + valor + "%'"
                    + " order by(t.cod_tese) ");
            
            if (rs != null) { 
                while (rs.next()) { 
                    TeseBD ts = new TeseBD();
                    ts.setCodigo(rs.getInt("t.cod_tese"));
                    ts.setRa_al(rs.getInt("t.ra_al"));
                    ts.setTitulo(rs.getString("t.titulo_tese"));
                    ts.setNomeAluno(rs.getString("a.nome_al"));
                    ts.setCodLinhaPesquisa(rs.getInt("t.cod_linhapesquisa"));
                    ts.setLinhaPesquisa(rs.getString("l.nome_linhapesquisa"));
                    ts.setCod_qualificacao(rs.getBoolean("t.qualificada_tese"));
                    ts.setCod_defesa(rs.getBoolean("t.defendida_tese"));
                    listaFiltro.add(ts);
                }
                return listaFiltro; 
          }else { 
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }
     
    public List<AlunoBD> filtroAluno(String nomeCurso, String anoIngresso) {      
        List<AlunoBD> listaFiltro = new ArrayList(); 
        try { 
            Connection con = conBD.conectar();
            BDTese = con.createStatement();

            //recupera os dados da turma de acordo com o nome da turma
            rs = BDTese.executeQuery("SELECT a.ra_al, a.nome_al "
                    + " FROM aluno a, curso c "
                    + " WHERE a.cod_curso = c.cod_curso and "
                    + " c.nome_curso = '"+nomeCurso+"' and "
                    + " year(a.dataingresso_al) = '"+anoIngresso+"' ");
            
            if (rs != null) {                                
                    while (rs.next()) {
                        AlunoBD al = new AlunoBD();
                                               
                        //Seta os dados
                        al.setRa(rs.getInt("a.ra_al"));
                        al.setNome(rs.getString("a.nome_al"));
                        // add na lista
                        listaFiltro.add(al); 
                }
                con.close();
                return listaFiltro; 
          }else {
                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }  
    
    public boolean inserirTese(TeseBD tes){
        try
        {
            Connection con = conBD.conectar();
            
            if(metBD.unique("tese", "ra_al", String.valueOf(tes.getRa_al()))){ //nome duplicado
                BDTese = con.createStatement();

                BDTese.execute("INSERT INTO tese VALUES ('"+tes.getCodigo()+"', "
                        + " '"+tes.getRa_al()+"', '"+tes.getTitulo()+ "', "
                        + " '"+tes.getCodLinhaPesquisa()+"', "+tes.getCod_qualificacao()+","
                        + " "+tes.getCod_defesa()+" );");
                
                JOptionPane.showMessageDialog(null,"Cadastro Realizado com Sucesso",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;    
            }
            else{
                JOptionPane.showMessageDialog(null,"Aluno já possui tese cadastrada",
                        "Tese duplicada", JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }           
        }
        catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, ex.getMessage(),
                   "Erro no banco", JOptionPane.ERROR_MESSAGE);       
        }       
        return false;
    }
    
    public boolean excluirTese(TeseBD tes){
        try{
            Connection con = conBD.conectar();
        
            //Verifica se tese que foi ENVIADA é FK de qualificacao
            BDTese = con.createStatement();
            rs = BDTese.executeQuery("SELECT count(cod_tese) from qualificacao "
                    + "where cod_tese = '"+tes.getCodigo()+"' ");
            rs.last();
            int capturaQualificacao= rs.getInt(1);

            //Verifica se tese que foi ENVIADA é FK de defesa
            BDTese = con.createStatement();
            rs = BDTese.executeQuery("SELECT count(cod_tese) from defesa "
                    + "where cod_tese = '"+tes.getCodigo()+"' ");
            rs.last();
            int capturaDefesa= rs.getInt(1);


            if(capturaQualificacao >= 1 || capturaDefesa >=1){ //Possui FK's?
                if(capturaQualificacao >= 1 && capturaDefesa >= 1){ //Duas FK's?
                    JOptionPane.showMessageDialog(null,"Tese possuí exames de qualificação e defesa,"
                            + " não pode ser excluída.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);                   
                }
                else{
                    if(capturaQualificacao >= 1){ // só a aluno
                        JOptionPane.showMessageDialog(null,"Tese possuí exame de qualificação,"
                                + " não pode ser excluída.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);
                    }
                    if(capturaDefesa >= 1){ // só a disciplina
                        JOptionPane.showMessageDialog(null,"Tese possuí exame de defesa,"
                                + " não pode ser excluída.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);  
                    }
                }
                con.close();
                return false;              
            }
            else{
                String sql = "delete from tese where cod_tese = ?";

                    PreparedStatement ps = con.prepareStatement(sql);

                    //código da tese enviado
                    ps.setString(1, (String.valueOf(tes.getCodigo())));

                    if (ps.executeUpdate() > 0) {
                        return true;
                    } else {
                        return false;
                    }
            }     
        }catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
            "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
   }
    
    public boolean alterarTese(TeseBD ts){
        String sql = "update tese set "
                + " titulo_tese = ?, cod_linhapesquisa = ? ";
        sql += " where cod_tese = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
                        
            PreparedStatement ps = con.prepareStatement(sql);

            ps.setString(1, ts.getTitulo());
            ps.setString(2, (String.valueOf(ts.getCodLinhaPesquisa())));
            ps.setString(3, (String.valueOf(ts.getCodigo())));

            if (ps.executeUpdate() > 0) {
                JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso",
                        "Alterar", JOptionPane.INFORMATION_MESSAGE);
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
    
    /** Método para alterar se a tese foi qualificada ou não. 
     * @param qualificada: true para sim, false para não.
     */
    public boolean alterarTeseQualificada(int codTese, boolean qualificada){
        String sql = "UPDATE tese SET qualificada_tese = ? "
                + " WHERE cod_tese = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
                        
            PreparedStatement ps = con.prepareStatement(sql);

            ps.setBoolean(1, qualificada);
            ps.setInt(2, codTese);

            if (ps.executeUpdate() > 0) {
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
    
    public boolean alterarTeseDefendida(int codTese, boolean qualificada){
        String sql = "UPDATE tese SET defendida_tese = ? "
                + " WHERE cod_tese = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
                        
            PreparedStatement ps = con.prepareStatement(sql);

            ps.setBoolean(1, qualificada);
            ps.setInt(2, codTese);

            if (ps.executeUpdate() > 0) {
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
    
    public AlunoBD buscarRaNome(int codTese){
        AlunoBD aluno = new AlunoBD();
        
        try { 
            Connection con = conBD.conectar();
            BDTese = con.createStatement();

            //recupera os dados da turma de acordo com o nome da turma
            rs = BDTese.executeQuery("SELECT a.ra_al, a.nome_al "
                    + " FROM aluno a, tese t "
                    + " WHERE a.ra_al = t.ra_al and "
                    + " t.cod_tese = '"+codTese+"' ");
            rs.first();
            
            if (rs != null) {                                                           
                //Seta os dados
                aluno.setRa(rs.getInt("a.ra_al"));
                aluno.setNome(rs.getString("a.nome_al"));
                // add na lista
                
            }
            
            con.close();
            return aluno; 
         
        } catch (SQLException e) { 
            return null; 
        } 
    }
  
}
